//
// Created by 24087 on 2025/3/5.
//

#include "../Inc/Control.h"
volatile uint16_t _OverFlow_time = 0;
const uint16_t TIM_CYCLE_NUMBER = 65536;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM1)
    {
        Key_Tick();
    }

    if (htim->Instance == TIM3)
    {
        _OverFlow_time++;
    }
}

uint64_t Get_us()
{
    uint32_t overflow;
    uint32_t counter;

    // 原子化读取（避免读取时发生溢出）
    do
    {
        overflow = _OverFlow_time; // 先读溢出次数
        counter = __HAL_TIM_GET_COUNTER(&htim3); // 再读当前计数值
    } while (overflow != _OverFlow_time); // 检查溢出次数是否变化（若变化则重试）

    // 计算总时间 = 溢出次数 * 65536 + 当前计数值
    return (uint64_t) overflow * 65536ULL + counter;
}

